package container

import (
	"github.com/docker/go-connections/nat"
	"xemo.top/docker/docker/api/types/blkiodev"
	"xemo.top/docker/docker/api/types/strslice"
)

// HostConfig 容器的不可移植配置结构。
// HostConfig the non-portable Config structure of a container.
// 在这里，“不可移植”意味着“依赖于我们运行的主机”。
// Here, "non-portable" means "dependent of the host we are running on".
// 便携式信息*应*出现在配置中。
// Portable information *should* appear in Config.
type HostConfig struct {
	//适用于所有平台
	// Applicable to all platforms
	//此容器的卷绑定列表
	// List of volume bindings for this container
	Binds []string
	//写入containerId的文件（路径）
	// File (path) where the containerId is written
	ContainerIDFile string
	//此容器的日志配置
	// Configuration of the logs for this container
	LogConfig LogConfig
	//容器使用的网络模式
	// Network mode to use for the container
	NetworkMode NetworkMode
	//暴露端口（容器）和主机之间的端口映射
	// Port mapping between the exposed port (container) and the host
	PortBindings nat.PortMap
	//用于容器的重启策略
	// Restart policy to be used for the container
	RestartPolicy RestartPolicy
	//容器退出时自动移除
	// Automatically remove container when it exits
	AutoRemove bool
	//用于装载卷的卷驱动程序的名称
	// Name of the volume driver used to mount volumes
	VolumeDriver string
	//从其他容器中取出的卷列表
	// List of volumes to take from other container
	VolumesFrom []string

	//适用于UNIX平台
	// Applicable to UNIX platforms
	//要添加到容器中的内核功能列表
	// List of kernel capabilities to add to the container
	CapAdd strslice.StrSlice
	//要从容器中删除的内核功能列表
	// List of kernel capabilities to remove from the container
	CapDrop strslice.StrSlice
	//容器可用的内核功能列表（这将覆盖默认设置）
	// List of kernel capabilities to be available for container (this overrides the default set)
	Capabilities []string `json:"Capabilities"`
	//要查找的DNS服务器列表
	// List of DNS server to lookup
	DNS []string `json:"Dns"`
	//要查找的DNSOption列表
	// List of DNSOption to look for
	DNSOptions []string `json:"DnsOptions"`
	//要查找的DNSSearch列表
	// List of DNSSearch to look for
	DNSSearch []string `json:"DnsSearch"`
	//额外主机列表
	// List of extra hosts
	ExtraHosts []string
	//容器进程将作为其他组运行的列表
	// List of additional groups that the container process will run as
	GroupAdd []string
	//用于容器的IPC命名空间
	// IPC namespace to use for the container
	IpcMode IpcMode
	// Cgroup 用于容器的组
	// Cgroup to use for the container
	Cgroup CgroupSpec
	// 链接列表（名称：别名形式）
	// List of links (in the name:alias form)
	Links []string
	//容器偏好OOM清除
	// Container preference for OOM-killing
	OomScoreAdj int
	//用于容器的PID命名空间
	// PID namespace to use for the container
	PidMode PidMode
	//容器是否处于特权模式
	// Is the container in privileged mode
	Privileged bool
	//docker应该发布容器的所有暴露端口吗
	// Should docker publish all exposed port for the container
	PublishAllPorts bool
	//容器根文件系统是否为只读
	// Is the container root filesystem in read-only
	ReadonlyRootfs bool
	//用于为MLS系统（如SELinux）自定义标签的字符串值列表
	// List of string values to customize labels for MLS systems, such as SELinux
	SecurityOpt []string
	//每个容器的存储驱动程序选项
	// Storage driver options per container
	StorageOpt map[string]string `json:",omitempty"`
	//用于容器的tmpfs（挂载）列表
	// List of tmpfs (mounts) used for the container
	Tmpfs map[string]string `json:",omitempty"`
	//用于容器的UTS命名空间
	// UTS namespace to use for the container
	UTSMode UTSMode
	//用于容器的用户命名空间
	// The user namespace to use for the container
	UsernsMode UsernsMode
	//shm内存使用总量
	// Total shm memory usage
	ShmSize int64
	//用于容器的Namespaced sysctls列表
	// List of Namespaced sysctls used for the container
	sysctls map[string]string `json:",omitempty"`
	//与此容器一起使用的运行时
	// Runtime to use with this container
	Runtime string `json:",omitempty"`

	// 适用于Windows
	// Applicable to Windows
	//初始控制台尺寸（高度、宽度）
	// Initial console size (height,width)
	ConsoleSize [2]uint
	//容器的隔离技术（例如默认、hyperv）
	// Isolation technology of the container (e.g. default,hyperv)
	Isolation Isolation

	//容器容器的资源（cgroups、ulimits）
	// Containers container's resources (cgroups,ulimits)
	Resources
}

// 资源包含容器的资源 (cgroups config,ulimits...)
// Resources contains container's resources (cgroups config,ulimits...)
type Resources struct {
	//适用于所有平台
	// Applicable to all platforms
	//CPU份额（相对于其他容器的相对重量）
	// CPU shares (relative weight vs. other containers)
	CPUShares int64 `json:"CpuShares"`
	//内存限制（字节）
	// Memory limit (in bytes)
	Memory int64
	//CPU配额，以10<sup>-9</sup>个CPU为单位。
	// CPU quota in units of 10<sup>-9</sup> CPUs.
	NanoCPUs int64 `json:"NanoCpus"`

	//适用于UNIX平台
	// Applicable to UNIX platforms
	// Parent cgroup
	CgroupParent string
	// Block IO weight (relative weight vs. other containers)
	BlkioWeight          uint16
	BlkioWeightDevice    []*blkiodev.WeightDevice
	BlkioDeviceReadBps   []*blkiodev.ThrottleDevice
	BlkioDeviceWriteBps  []*blkiodev.ThrottleDevice
	BlkioDeviceReadIOps  []*blkiodev.ThrottleDevice
	BlkioDeviceWriteIOps []*blkiodev.ThrottleDevice
	//CPU CFS（完全公平调度程序）周期
	// CPU CFS (Completely Fair Scheduler) period
	CPUPeriod int64 `json:"CpuPeriod"`
	// CPU CFS (Completely Fair Scheduler) quota
	CPUQuota int64 `json:"CpuQuota"`
	// CPU real-time period
	CPURealtimePeriod int64 `json:"CpuQuota"`
	// CPU real-time runtime
	CPUrealtimeRuntime int64 `json:"CpuRealtimeRuntime"`
	// CpusetCpus 0-2,0,1
	CpusetCpus string
	// CpusetMems 0-2,0,1
	CpusetMems string
	//容器内要映射的设备列表
	// List of devices to map inside the container
	Devices []DeviceMapping
	//要添加到设备组的规则列表
	// List of rule to be added to the device cgroup
	DeviceCgroupRules []string
	//设备驱动程序的设备请求列表
	// List of device requests for device drivers
	DeviceRequests []DeviceRequest
	// kernel memory limit (in bytes)
	KernelMemory int64
	//内核TCP缓冲内存的硬限制（int字节）
	// Hard limit for kernel TCP buffer memory (int bytes)
	KernelMemoryTCP int64
	//内存软限制（字节）
	// Memory soft limit (in bytes)
	MemoryReservation int64
	//总内存使用量（内存+交换）；设置“-1”以启用无限制交换
	// Total memory usage (memory + swap); set `-1` to enable unlimited swap
	MemorySwap int64
	//调整容器内存交换行为
	// Tuning container memory swappiness behaviour
	MemorySwappiness *int64
	//是否禁用OOM killer
	// Whether to disable OOM killer or not
	OomKillDisable *bool

	//适用于Windows
	// Applicable to Windows
	// CPU count
	CPUCount int64 `json:"CpuCount"`
	// CPU percent
	CPUPercent int64 `json:"CpuPercent"`
	//容器系统驱动器的最大IOps
	// Maximum IOps for the container system drive
	IOMaximumIOps uint64
	//容器系统驱动器的最大IO（字节/秒）
	// Maximum IO in bytes per second for the container system drive
	IOMaximumBandWidth int64
}

// DeviceRequest 表示设备驱动程序对设备的请求。
// DeviceRequest represents a request for devices from a device driver.
// 由GPU设备驱动程序使用
// Used by GPU device drivers
type DeviceRequest struct {
	// 设备驱动程序名称
	// Name of device driver
	Driver string
	//要请求的设备数量（-1=全部）
	// Number of devices to request (-1 = All)
	Count int
	//设备驱动程序可识别的设备ID列表
	// List of device IDs as recognizable by the device driver
	DeviceIDs []string
	//设备功能AND列表的OR列表（例如“gpu”）
	// An OR list of AND lists of device capabilities (e.g. "gpu")
	Capabilities [][]string
	//传递到设备驱动程序的选项
	// Options to pass onto the device driver
	Options map[string]string
}

// DeviceMapping 表示主机和容器之间的设备映射
// DeviceMapping represents the device mapping between the host and the container
type DeviceMapping struct {
	PathOnHost       string
	PathInContainer  string
	CgroupPermission string
}

// 隔离代表了容器的隔离技术。支持的值是特定于平台的
// Isolation represents the isolation technology of a container.The supported values are platform specific
type Isolation string

// UsernsMode 表示容器中的userns模式
// UsernsMode represents userns mode in the container
type UsernsMode string

// UTSMode 表示容器的UTS命名空间
// UTSMode represents the UTS namespace of the container
type UTSMode string

// PidMode 表示容器的pid命名空间。
// PidMode represents the pid namespace of the container.
type PidMode string

// CgroupSpec 表示用于容器的cgroup
// CgroupSpec represents the cgroup to use for the container
type CgroupSpec string

// IpcMode 代表容器ipc堆栈
// IpcMode represents the container ipc stack
type IpcMode string

// RestartPolicy表示容器的重启策略。
// RestartPolicy represents the restart policies of the container.
type RestartPolicy struct {
	Name              string
	MaximumRetryCount int
}

// LogConfig 表示容器的日志配置。
// LogConfig represents the logging configuration of the container.
type LogConfig struct {
	Type   string
	Config map[string]string
}

// NetworkMode 表示容器网络堆栈
// NetworkMode represents the container network stack
type NetworkMode string
